package ExceptionAndThread.Exception;

/*throw关键字
    作用：
        可以使用throw关键字在指定的方法中抛出指定的异常
    使用格式：
        throw new xxxException（"异常产生的原因"）；
    注意：
        1、throw关键字必须写在方法的内部
        2、throw关键字后面new的对象必须是Exception或者其子类
        3、throw关键字抛出指定的异常对象，我们就必须处理这个异常对象
               throw关键字创建的是RunTimeException或者是RunTimeException的子类，可以不处理，默认交给JVM处理（打印出异常对象，终断程序）
               throw关键字关键字后面创建的是编写异常（编写代码是报错），则使用 throws或者try...catch

*/
public class Exception02 {
    public static void main(String[] args) {
        // int[] arr1 = null;
        // //Exception in thread "main" java.lang.NullPointerException: 传递的数组值为空
        // System.out.println(get(arr1, 0));

        int[] arr2 = {1, 2, 3};
        //Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 输入的索引超出数组边界
        System.out.println(get(arr2, 3));

    }

    /*
    定义一个方法：
        参数：
        int[] arr
        int index
    编写代码时，必须先对方法传递的参数进行合法性校验
    如果参数不合法，则必须使用抛出异常的方式，告知方法的调用者，传递的参数有问题
    注意：
    NullPointerException是一个运行期异常，可以交由JVM处理
    IndexOutOfBoundsException是一个运行期异常，可以交由JVM处理
    他们都是RunTimeException的子类
     */
    public static int get(int[] arr, int index) {
    /*
        对传递的参数数组，进行合法性校验
        如果数组是null
        则抛出空指针异常，告知方法的调用者main方法，传递的数组值为null
    */
        if (arr == null) {
            throw new NullPointerException("传递的数组值为空");
        }
    /*
        对传递的参数index，进行合法性校验
        如果超出数组范围
        则抛出数组越界异常，告知方法的调用者main方法，传递的index值超出数组边界
    */
        if (index > arr.length - 1 || index < 0) {
            throw new ArrayIndexOutOfBoundsException("输入的索引超出数组边界");
        }
        return arr[index];
    }
}